package com.asm;

import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.results.format.ResultFormatType;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;

import java.util.concurrent.TimeUnit;

@Fork(1)
@BenchmarkMode(Mode.AverageTime)      // 统计 方法的平均 运行时间
@Warmup(iterations=3)                 // 预热 次数，(充分优化 得到最真实结果)
@Measurement(iterations=5)            // 最后-进行-运行-次数
@OutputTimeUnit(TimeUnit.NANOSECONDS) // 运行时间 单位：纳秒
/*
====================================
|  ---锁消除 (JIT即时编译器优化)---   |
######################################################################
注意：要打成 jar包 ，然后 在 Terminial 命令行里运行  【不过我运行没成功】   #
######################################################################
E:\JAVA\code\b站学习\concurrent\elimination-locks\target>java -jar elimination-locks-1.0.0.jar

java -XX:-EliminateLocks -jar benchmarks.jar
Main-Class: com.asm.T1_Elimination


|-----------------------------------------
|  结果 ： 两个方法 运行时间非常接近          |
|  java -jar elimination-locks-1.0.0.jar |
|------------------------------------------------------------------------------------------
|Benchmark           Mode Samples Score   Score error Units
|c.i.MyBenchmark.a   avgt     5    1.542   0.056       ns/op
|c.i.MyBenchmark.b   avgt     5    1.518   0.091       ns/op
|==========================================================================================
|---------------------------------------------------------------------------
| 运行： java -XX:-EliminateLocks -jar benchmarks.jar  (不适用JIT锁消除的优化)
|------------------------------------------------------------------------------------------
| Benchmark          Mode Samples Score   Score error Units
| c.i.MyBenchmark.a  avgt    5     1.507   0.108      ns/op
| c.i.MyBenchmark.b  avgt    5    16.976   1.572      ns/op
|==========================================================================================


------------------------------------------------------------------------------------------------------
| 运行时间相近的原因：                                                                                  /
| 1. java是解析+编译的执行方式                                                                          /
| 2. java运行时 有个 [JIT即时编译器]（会对反复执行的热点代码会 进行优化）                                    /
| 3. [JIT即时编译器] 会在b()方法时，发现局部变量 o根本不会逃离方法的作用范围 (不可能被共享，所以加锁没意义！),    /
|      所以即时编译器 会把synchronized优化掉                                                             /
=======================================================================================================
 */
public class T1_Elimination {



    static int x = 0;
    @Benchmark
    public void a() throws Exception {
        x++;
    }
    @Benchmark
    public void b() throws Exception {
        Object o = new Object();
        synchronized (o) {
            x++;
        }
    }

//    public static void main(String[] args) throws RunnerException {
//        Options opt = new OptionsBuilder()
//                .include(T1_Elimination.class.getSimpleName())
//                .forks(1)
//                .warmupIterations(3)
//                .measurementIterations(3)
//                .build();
//
//        new Runner(opt).run();
//    }

}